package com.jrauto.CarAppBackend.service.impl;

/**
 * @author : huiMing
 * Date : 2025年09月03日 16:28
 * @version V1.0
 */
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jrauto.CarAppBackend.entity.ChatMedia;
import com.jrauto.CarAppBackend.entity.ChatMessage;
import com.jrauto.CarAppBackend.entity.ChatSession;
import com.jrauto.CarAppBackend.mapper.ChatMediaMapper;
import com.jrauto.CarAppBackend.mapper.ChatMessageMapper;
import com.jrauto.CarAppBackend.mapper.ChatSessionMapper;
import com.jrauto.CarAppBackend.service.IChatService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;

/**
 * 聊天服务实现类
 */
@Service
public class ChatServiceImpl extends ServiceImpl<ChatMessageMapper, ChatMessage> implements IChatService {

    @Resource
    private ChatSessionMapper chatSessionMapper;

    @Resource
    private ChatMessageMapper chatMessageMapper;

    @Resource
    private ChatMediaMapper chatMediaMapper;


    /**
     * 发送消息的事务性操作：
     * 1. 插入消息到 chat_message 表
     * 2. 更新或创建 chat_session 表
     * 为了保证数据一致性，这里使用了事务。
     */
    @Transactional
    @Override
    public ChatMessage sendMessage(ChatMessage message) {
        // 1. 插入消息到消息表
        baseMapper.insert(message);

        // 2. 如果是媒体消息，更新 chat_media 表中的 messageId 字段
        if (message.getMessageType() != 1 && message.getExtra() != null) {
            Integer mediaId = message.getExtra().getInteger("mediaId");
            if (mediaId != null) {
                ChatMedia media = new ChatMedia();
                media.setId(mediaId);
                media.setMessageId(message.getId());
                chatMediaMapper.updateById(media);
            }
        }

        // 3. 更新或创建会话
        // 假设这里已经有会话ID，实际业务中需要根据发送者和接收者ID判断会话是否存在
        ChatSession session = chatSessionMapper.selectById(message.getSessionId());
        if (session != null) {
            session.setLastMessage(message.getContent());
            session.setLastMessageTime(message.getCreatedAt());
            chatSessionMapper.updateById(session);
        } else {
            // 首次创建会话，需要在这里处理
            // 为简化示例，这里假设会话已存在
        }

        return message;
    }

    /**
     * 保存媒体资源信息
     * @param media 媒体资源对象
     * @return 保存成功的媒体资源对象
     */
    @Override
    public ChatMedia saveMedia(ChatMedia media) {
        chatMediaMapper.insert(media);
        return media;
    }

    /**
     * 获取用户会话列表
     * @param userId 用户ID
     * @return 会话列表
     */
    @Override
    public List<ChatSession> getSessionsByUserId(Integer userId) {
        return chatSessionMapper.findSessionsByUserId(userId);
//        return null;
    }

    /**
     * 获取会话消息记录
     * @param sessionId 会话ID
     * @param page 页码
     * @param size 每页数量
     * @return 消息列表
     */
    @Override
    public List<ChatMessage> getMessagesBySessionId(Integer sessionId, int page, int size) {
        int offset = (page - 1) * size;
        return chatMessageMapper.findMessagesBySessionId(sessionId, offset, size);
//        return null;
    }

    /**
     * 逻辑删除会话
     * @param userId 用户ID
     * @param sessionId 会话ID
     * @return 是否删除成功
     */
    @Override
    public boolean deleteSession(Integer userId, Integer sessionId) {
        // 实际应用中，不应直接物理删除会话，可以设置一个标志位（例如 deleted=true）
        // 或者从当前用户的会话列表中移除该会话的关联
        // 这里只是一个简单的示例，实际应根据业务逻辑来处理
        return true;
    }

    public void setChatMessageMapper(ChatMessageMapper chatMessageMapper) {
        this.chatMessageMapper = chatMessageMapper;
    }



}
